#include "arp_func.h"

struct arp_link* arp_link_hread = NULL;

struct arp_link* arp_link_find(unsigned char* ip_in)
{
    //创建一个临时hread节点
    struct arp_link* temp_node = arp_link_hread;
    while (temp_node)//通过节点状态循环,为null退出
    {
        //判断当前节点的ip和传入的ip的值,逐字节对比
        if (memcmp(temp_node->ip,ip_in,4)==0)//相等则直接退出循环
            break;
        //不相等则将while循环条件的节点指向下一个节点       
        temp_node = temp_node->next;
    }
    //返回临时创建的节点的数据,找到相等ip返回当前节点,否则返回null
    return temp_node;
}

void* get_arp_link(void* agv)
{
    //将收到的数据转为对应的mac头和arp包的结构体
    struct mac_hread* mac_h = (struct mac_hread*)agv;
    struct arp_hread* arp_h = (struct arp_hread*)((char*)agv+14);    

    //检查本次收到的arp包的ip有没有在链表记录里面
    struct arp_link* re_find = arp_link_find(arp_h->src_ip);

    
    if (re_find == NULL)//通过返回值判断历史记录里面是否有记录,null为无记录
    { 
        //没有记录便向内存申请一个arp链表的节点
        struct arp_link* arp_node = (struct arp_link*)malloc(sizeof(struct arp_link));
        memcpy(arp_node->ip,arp_h->src_ip,4);//将收到的数据中源ip存入节点
        memcpy(arp_node->mac,arp_h->src_mac,6);//将收到的数据中源mac存入节点
        //直接将节点的指针指向hread对应的数据后再把节点的地址赋给hread(单向链表,赋给hread最便捷)
        arp_node->next = arp_link_hread;
        arp_link_hread = arp_node; 
    }
    else//否则为有记录
    {
        //有记录就直接更新原先链表节点里面的mac地址
        memcpy(re_find->mac,mac_h->src_mac,6);
    }
    
    return NULL;
}